//
//  sstUdp.h
//  OpensslTest
//
//  Created by jiahua on 16/3/30.
//  Copyright © 2016年 secsmarts. All rights reserved.
//
//  此类用来进行UDP的接收和发送处理
//



#import <Foundation/Foundation.h>
#import "GCDAsyncUdpSocket.h"
#import "KeyManage.h"

@class sstUdp;


/**
 *  定义udp的错误代理
 */
@protocol SSTUdpErrorDelegate

@optional
/**
 *  UDP的错误处理代理
 *
 *  @param udp <#udp description#>
 *  @param tag 错误代码
 */
-(void)sstUdpError:(sstUdp*)udp withTag:(NSInteger)tag;
@end

/**
 *  定义UDP信息通知代理
 */
@protocol SSTUdpInfoNotifyDelegate
@optional
/**
 *  UDP的信息处理代理
 *
 *  @param udp <#udp description#>
 *  @param info
 */
-(void)sstInfoNotify:(sstUdp*)udp withInfo: (NSString *)info;
@end

/**
 *  定义sstUdp，这里自己实现其代理是为了发送前进行自身秘钥协商使用
 */
@interface sstUdp : GCDAsyncUdpSocket

/**
 *  发送消息目的Ip
 */
@property(nonatomic)NSString* host;
/**
 *  发送消息的端口port
 */
@property(nonatomic)int port;

/**
 * 通知代理，主要为测试使用，可以不实现此代理
 */
@property(nonatomic, retain) id<SSTUdpInfoNotifyDelegate> udpInfoNotifyDelegate;

/**
 *  错误代理
 */
@property(nonatomic, retain) id<SSTUdpErrorDelegate> udpErrorDelegate;

/**
 *  接收数据，重载自GCDAsyncUdpSocket，封装一层秘钥管理，把sst格式数据拆包并进行解密
 *
 *  @param data
 *  @param address
 *  @param context
 */
- (void)notifyDidReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)context;

/**
 *  发送数据，重载自GCDAsyncUdpSocket，封装一层秘钥管理，加密并打包成sst格式
 *
 *  @param data
 *  @param remoteAddr
 *  @param timeout
 *  @param tag        
 */
-(void)sendData:(NSData *)data toAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout tag:(long)tag;
-(void)sendData:(NSData *)data toHost:(NSString *)host port:(uint16_t)port withTimeout:(NSTimeInterval)timeout tag:(long)tag;
-(void)sendData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;

@end
